<?php
require_once 'PaiPaiRequest.class.php';
require_once 'PaiPaiDeal.class.php';
require_once 'PaiPaiItem.class.php';
require_once 'PaiPaiAttr.class.php';
require_once 'PaiPaiUser.class.php';
require_once 'PaiPaiMessage.class.php';
require_once 'PaiPaiShop.class.php';
require_once 'PaiPaiEvaluation.class.php';
require_once 'PaiPaiProduct.class.php';
/**
 *PaiPai接口运行时发生错误时，抛出此异常.
 */
class PaiPaiRuntimeExecption extends Exception{
	function __construct($errorCode,$errorMessage){
		parent::__construct($errorMessage,$errorCode);
	}
}

/**
 * PaiPai接口运行时.
 * until 2010/10/10,oneday not implement
 */
class PaiPaiRuntime {
	/**
	 * @var PaiPaiRequest $request 用于访问paipai接口.
	 */
	var $request;
	/**
	 * @var integer $maxTryCount 调用可重调用数据不变接口函数失败最大重试次数，默认2次
	 */
	var $maxTryCount=2;
	/**
	 * @var integer $minTrySpanMicroseconds 调用可重调用数据不变接口函数失败最小重试时间间隔，毫秒数，默认300毫秒。
	 */
	var $minTrySpanMicroseconds=300;
	/**
	 * @var integer $maxTrySpanMicroseconds 调用可可重调用数据不变接口函数失败最大重试时间间隔，毫秒数，默认500毫秒。
	 */
	var $maxTrySpanMicroseconds=500;	
	
	/**
	 * 创建paipai接口API.
	 * @param array $paipai_token 操作用户的PaiPai 令牌.
	 * <br/>必须包含以下参数：<br/>
	 * string $uin 操作用户QQ号码，用于认证操作用户的身份.<br/>
	 * string $token 用于认证操作用户的身份.<br/>
	 * string $spid 用于验证请求包是否被篡改.<br/>
	 * string $skey 用于用户鉴权，将相关参数通过md5加密为一个sign值.
	 */
	function __construct($paipai_token) { //
		if (! is_array ( $paipai_token ))
			throw new PaiPaiRuntimeExecption ( - 1, 'PaiPaiRuntime创建失败：参数类型错误' );
		
		$uin = $paipai_token ['uin'];
		$token = $paipai_token ['token'];
		$spid = $paipai_token ['spid'];
		$skey = $paipai_token ['skey'];
		
		if (! ($uin && $skey && $spid && $skey))
			throw new PaiPaiRuntimeExecption ( - 1, 'PaiPaiRuntime创建失败：参数错误' );
		
		$this->request = new PaiPaiRequest ();
		$this->request->app_token = array ('uin' => $uin, 'token' => $token, 
		 			'spid' => $spid, 'skey' => $skey );
	}
	function __destruct() {
	   $this->request=NULL;
	}
	/**
	 * 将数组 $params 的值导入到对象 $obj 中，主要用于本类函数的参数对象中，如DealSearchParam $param
	 * <br/>此函数仅用于简单对象，即不包含其它对象的复杂对象。仅导入数组存在的同名var
	 * @param array $params  源数组
	 * @param mixed $obj 目标对象
	 */
	static function put_object_vars(array &$params,$obj){
		if (count ( $params ) == 0 || ! is_object ( $obj ))	return;
		foreach ( $params as $key => $val )
		  if (isset($val) && property_exists( $obj,$key ))
		     $obj->$key = $val;
	}
		
   
	/**
	 * 卖家查找订单列表，paipai cmdid:deal.sellerSearchDealList
	 * <br/>读取卖家在拍拍网销售的订单列表。
	 * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
	 * @param DealSearchResultList $dsrlist 查找结果的对象
	 * @param DealSearchParam $param 查找参数，所有设置的查询条件是AND的关系
	 * @return DealSearchResultList 返回读取后的  $dsrlist
	 */

	function readDealSellerSearchDealList(DealSearchResultList $dsrlist,DealSearchParam $param){
		if(!$dsrlist || ! $param)
		  throw  new PaiPaiRuntimeExecption(-1,'readDealsellerSearchDealList运行失败：参数错误');
		if(!$param->sellerUin)
		    $param->sellerUin=$this->request->app_token['uin'];
		$paramarr=get_object_vars($param);
		
		$resultarr=&$this->__fireRequest('deal.sellerSearchDealList',$paramarr);
        return  $this->__firefillProperty($dsrlist,$resultarr,DealSearchResultList::$_DataLayerout['varclass']);
	}
	/**
	 * 卖家查找订单详情接口，paipai cmdid:deal.getDealDetail
	 * <br/>用于卖家根据拍拍网销售订单号列表查询订单的详细信息
	 * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
	 * @param DealDetail $detail 要填充的订单详情对象
	 * @param string $dealCode 订单编号，查询的订单ID
	 * @param intger $listItem 是否列出商品，0（默认）：不列出订单相关商品，
	 * 非0：列出订单相关商品（速度比较慢）
	 * @return DealDetail 返回读取后的  $detail
	 */
	function readDealDetail(DealDetail $detail,$dealCode,$listItem=0){
		if(!$detail || ! $dealCode)
		  throw  new PaiPaiRuntimeExecption(-1,'readDealDetail运行失败：参数错误');
		$paramarr=array('sellerUin'=>$this->request->app_token['uin'],'dealCode'=>$dealCode,'listItem'=>$listItem);
		$resultarr=&$this->__fireRequest('deal.getDealDetail',$paramarr);
		return $this->__firefillProperty($detail,$resultarr,DealDetail::$_DataLayerout['varclass']);	
	}

	/**
	 * 卖家订单标记发货，paipai cmdid:deal.sellerConsignDealItem
	 * <br/>只有状态为“买家已付款，等待卖家发货”的订单才能进行此操作
	 * <br/>所以卖家再调用该接口之前，必须先查询订单的状态是否处于“买家已付款，等待卖家发货”，否则频繁调用接口失败时将会被后台处罚！
	 * <br/>当前拍拍的一个订单只能支持一个发货单号,暂不支持一个订单对应多个发货单号的情况.如果卖家需要对一个订单中的商品做多次发货的话,一个把发货的相关信息填写到订单的备注中.
	 * @param string $dealCode 订单编号,查询的订单ID
	 * @param string $logisticsName 物流公司名称,自定义的发货公司名称，10个字节
	 * @param string $logisticsCode 发货单号,20字节 
	 * @param number $arriveTime   arriveDays 预计几天后到货,[3,5,7,10] 
	 * @param string $logisticsDesc 可选,卖家填写的发货说明,卖家填写的发货说明，0-100字节
	 */
	function writeDealSellerConsignmentDealItem($dealCode,$logisticsName,$logisticsCode,
	   $arriveTime,$logisticsDesc=''){
		if(!$dealCode || ! $logisticsName || ! $logisticsCode || ! $arriveTime)
		  throw  new PaiPaiRuntimeExecption(-1,'writeDealSellerConsignmentDeal运行失败：参数错误');		
		$paramarr=array('sellerUin'=>$this->request->app_token['uin'],'dealCode'=>$dealCode,
		'logisticsName'=>$logisticsName,'logisticsCode'=>$logisticsCode,
		'arriveDays'=>$arriveTime,'logisticsDesc'=>$logisticsDesc);
		$this->__fireRequest('deal.sellerConsignDealItem',$paramarr,false);
	}
	/**
	 * 卖家标记订单配货中，paipai cmdid: deal.sellerSignDealPreparing [old:deal.sellerPrepareShippingDeal]
	 * <br/>卖家通过调用本接口标记订单当前的状态为配货中（卖家标记发货之后则不能调用该接口）
	 * <br/> 只有状态为“买家已付款，等待卖家发货”的订单才能进行此操作
	 * @param string $dealCode 订单编号，查询的订单ID
	 */
	function writeDealSellerPrepareShippingDeal($dealCode){
		if(!$dealCode )
		  throw  new PaiPaiRuntimeExecption(-1,'writeDealSellerPrepareShippingDeal运行失败：参数错误');		
		$paramarr=array('sellerUin'=>$this->request->app_token['uin'],'dealCode'=>$dealCode);
	    $resultarr=&$this->__fireRequest('deal.sellerSignDealPreparing',$paramarr);
	    if($resultarr['dealCode']!=$dealCode)	
		  throw  new PaiPaiRuntimeExecption(-3,'writeDealSellerPrepareShippingDeal运行失败：返回结果错误');		
		
	}
	/**
	 * 卖家通过调用本接口取消订单，paipai cmdid:deal.sellerCancelDeal
	 * <br/>卖家通过调用本接口取消订单(买家付款之后只能走申请退款接口，不能调用该接口取消订单)
	 * <br/>只有状态为“等待买家付款”的订单才能进行此操作，调用该接口需要至少有“商业长期授权”级别的校验权限
	 * @param string $dealCode 订单编号，查询的订单ID
	 * @param integer $closeReason 填写的取消说明，填下面说明中的数字。
	 * <br/>0, "无法联系上买家"<br/>1, "买家误拍或重拍了,<br/>2, "买家无诚意完成交易",
	 * <br/>3, "已通过银行线下汇款"<br/>"已通过同城见面交易"<br/>5, "已通过货到付款交易"
	 * <br/>6, "已通过网上银行直接汇款"<br/>7, "已经缺货无法交易",
	 */
	function writeDealSellerCancelDeal($dealCode,$closeReason){
		if(!$dealCode || ! $closeReason )
		  throw  new PaiPaiRuntimeExecption(-1,'writeDealSellerCancelDeal运行失败：参数错误');		
		$paramarr=array('sellerUin'=>$this->request->app_token['uin'],'dealCode'=>$dealCode,
		    'closeReason'=>$closeReason);
	    $resultarr=&$this->__fireRequest('deal.sellerCancelDeal',$paramarr);
	    if($resultarr['dealCode']!=$dealCode)	
		  throw  new PaiPaiRuntimeExecption(-3,'writeDealSellerCancelDeal运行失败：返回结果错误');		
	}
    /**
     * 卖家添加/修改订单备注，paipai cmdid:deal.modifySellerNote
     * <br/>卖家可以给订单添加备注内容，或者修改备注(不超过254个字符)
     * <br/>调用该接口需要至少有“商业长期授权”级别的校验权限
     * @param string $dealCode 订单编码
     * @param string $dealNote 订单备注内容，不超过254个字符
     */
	function writeDealModifySellerNote($dealCode,$dealNote){
		if(!$dealNote || ! $dealCode)
		  throw  new PaiPaiRuntimeExecption(-1,'writeDealModifySellerNote运行失败：参数错误');		
		$paramarr=array('sellerUin'=>$this->request->app_token['uin'],'dealCode'=>$dealCode,'dealNote'=>$dealNote);
		$this->__fireRequest('deal.modifySellerNote',$paramarr);
	}	

    /**
     * 卖家延长订单收货时间，paipai cmdid: deal.sellerDelayConsignmentTime
     * <br/>卖家通过调用本接口延长订单的收货时间（卖家标记发货之后才能调用该接口），
     * 只有状态为“卖家已发货，等待买家确认收货”的订单才能进行此操作
     * <br/>调用该接口需要至少有“商业长期授权”级别的校验权限
     * @param string $dealCode 订单编码
     * @param string $days 延长收货的天数，3，5，7，10
     */
	function writeDealSellerDelayConsignmentTime($dealCode,$days){
		if(!$days || ! $dealCode)
		  throw  new PaiPaiRuntimeExecption(-1,'writeDealSellerDelayConsignmentTime运行失败：参数错误');		
		$paramarr=array('sellerUin'=>$this->request->app_token['uin'],'dealCode'=>$dealCode,'days'=>$days);
		$this->__fireRequest('deal.sellerDelayConsignmentTime',$paramarr);
	}		
    /**
     * 卖家标记订单缺货，paipai cmdid: deal.sellerSignDealOutOfStock
     * <br/>只能整个订单所有的商品都同时标记缺货
     * <br/>只有状态为“买家已付款，等待卖家发货”的订单才能进行此操作，
     * 当订单中全部商品被标记缺货后，订单的状态变为：DS_CLOSED（订单已关闭），系统立即自动退款给买家；
     * 当订单中部分商品被标记为缺货后，订单的状态不变（买家已付款等待卖家发货），退款部分需要等待交易完成后才真正退回给买家；
     * <br/>调用该接口需要至少有“商业长期授权”级别的校验权限
     * @param string $dealCode 订单编码
     * @param string $days 延长收货的天数，3，5，7，10
     */
	function writeDealSellerSignDealOutOfStock($dealCode){
		if( ! $dealCode)
		  throw  new PaiPaiRuntimeExecption(-1,'writeDealSellerSignDealOutOfStock运行失败：参数错误');		
		$paramarr=array('sellerUin'=>$this->request->app_token['uin'],'dealCode'=>$dealCode);
		$this->__fireRequest('deal.sellerSignDealOutOfStock',$paramarr);
	}	
	//**卖家给订单留言（开发中）
	//**卖家查询订单留言（开发中）
	/**
	 * 根据商品编码查询单个商品信息，paipai cmdid:item.getItem
	 * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
	 * @param Item $item 要填充的商品信息对象
	 * @param string $itemCode     商品编码  $itemCode与$itemLocalCode必须设置一个
	 * @param string $itemLocalCode 合作商家的私有商品编码，
	 * 由商家保证该编码在其所有商品中的唯一性，不超过40 Bytes。
	 * 商家可根据此编码修改商品数据，或进行查询和修改操作，API不提供对该字段的修改。
	 * <br/>itemLocalCode默认为NULL， 不使用itemLocalCode查找
	 * @param integer $needDetailInfo 是否需要返回商品详情,0为不需要（默认）1为需要
	 * @param integer $needExtendInfo 是否需要返回附加信息,0为不需要（默认）1为需要
	 * <br/>强烈建议该字段在不需要时设置为0，因为这样能大大加快调用的返回速度。
	 * <br/>备注:女装商品的下载的时候需要用这个。5张图片必须设置这个为1才能下载到其他4张图片
	 * @param integer $needParseAttr 是否需要解析商品属性,0为不需要（默认）1为需要
	 * @return Item 返回读取后的  $item
	 */
	function readItem(Item $item,$itemCode,$itemLocalCode=NULL,$needDetailInfo=0,$needExtendInfo=0,
	                  $needParseAttr=0){
		if(!$item || (! $itemCode && !$itemLocalCode))
		  throw  new PaiPaiRuntimeExecption(-1,'readItem运行失败：参数错误');
		$paramarr=array('itemCode'=>$itemCode,'itemLocalCode'=>$itemLocalCode,
		     'needDetailInfo'=>$needDetailInfo,'needExtendInfo'=>$needExtendInfo,
		     'needParseAttr'=>$needParseAttr);
		$resultarr=&$this->__fireRequest('item.getItem',$paramarr);
		return $this->__firefillProperty($item,$resultarr,Item::$_DataLayerout['varclass']);	
	}
	/**
	 * 查询单个商品详情信息接口，paipai cmdid:item.getItemDetailInfo<br/>根据商品编码查询单个商品详情描述
	 * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
	 * @param string $detailinfo 商品详情描述
	 * @param string $itemCode 商品编码，商品编码, itemCode和itemLocalCode至少必须填写一个
	 * @param string $itemLocalCode 商品私有编码，合作商家的私有商品编码，
	 * 由商家保证该编码在其所有商品中的唯一性，不超过40 Bytes。
	 * <br/>商家可根据此编码修改商品数据，或进行查询和修改操作，API不提供对该字段的修改。
	 * <br/>itemCode和itemLocalCode至少必须填写一个，itemLocalCode默认为NULL，
	 * 不使用itemLocalCode查找
	 * @return string 返回读取后的  $detailinfo
	 */   
	function &readItemDetailInfo(&$detailinfo,$itemCode,$itemLocalCode=NULL){
		if(! $itemCode && !$itemLocalCode)
		  throw  new PaiPaiRuntimeExecption(-1,'readItemDetailInfo运行失败：参数错误');
		$paramarr=array('itemCode'=>$itemCode,'itemLocalCode'=>$itemLocalCode);
		$resultarr=&$this->__fireRequest('item.getItemDetailInfo',$paramarr);
		$item=new _PaipaiItemDetailInfo;
		$this->__firefillProperty($item,$resultarr);
		$detailinfo=$item->detailInfo;	
		return $detailinfo;	 		
	}
    /**
     * 查询店铺推荐商品列表，paipai cmdid:item.getShopRecommendList
     * <br/>根据店铺id查询卖家推荐的商品列表
     * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
     * @param ItemSearchShopRecommendItemResultList $itemList  要填充的店铺推荐商品结果列表
     * @param string $sellerUin 卖家QQ号码，默认使用本店QQ
     * @return ItemSearchResultList 返回已经填充的店铺推荐商品结果列表
     */
	function readItemShopRecommendList(ItemSearchShopRecommendItemResultList $result,$sellerUin=NULL){
		if(!$result)
		  throw  new PaiPaiRuntimeExecption(-1,'readItemShopRecommendList运行失败：参数错误');
		function handleGetResultFunc($result){ //remove comment
			return preg_replace ( '/,\s*\/\/(.*?)\n/s', ',',$result );
		}			  
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('sellerUin'=>$sellerUin);
		$resultarr=&$this->__fireRequest('item.getShopRecommendList',$paramarr,true,NULL,'handleGetResultFunc');
		return $this->__firefillProperty($result,$resultarr,
		       ItemSearchShopRecommendItemResultList::$_DataLayerout['varclass']);		  		
	}	
    /**
     * 卖家查询商品列表，paipai cmdid:item.sellerSearchItemList
     * <br/>根据卖家指定的条件查询商品信息列表
     * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
     * @param ItemSearchResultList $itemList  要填充的商品搜索结果列表
     * @param PaipaiItemSearchParam $param 商品搜索参数类
     * @return ItemSearchResultList 返回已经填充的商品搜索结果列表
     */
	function readItemSellerSearchItemList(ItemSearchResultList $itemList,
	                          PaipaiItemSearchParam $param){
		if(!$itemList || !$param)
		  throw  new PaiPaiRuntimeExecption(-1,'readItemSellerSearchItemList运行失败：参数错误');
		if(! $param->sellerUin) $param->sellerUin=$this->request->app_token['uin'];
		$paramarr=get_object_vars($param);
		$resultarr=&$this->__fireRequest('item.sellerSearchItemList',$paramarr);
		return $this->__firefillProperty($itemList,$resultarr,ItemSearchResultList::$_DataLayerout['varclass']);		  		
	}
	/**
	 * 发布商品接口，paipai cmdid:item.addItem
	 * <br/>调用本接口可以发布商品
	 * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
	 * @param PaipaiItemAddParam $param 发布商品的参数
	 * @return array  返回结果，数组结构如下
	 * <br/> itemCode：商品编码；<br/>itemLocalCode：商品本地编码，合作商家的私有商品编码；
	 * <br/>itemState：商品状态；<br/>stateDesc：商品状态原因描述。主要用于商品 非在售状态时，
	 * 告诉商家为什么商品不在上架销售状态。
	 */
	function writeItemAddItem(PaipaiItemAddParam $param){
		if(! $param)
		  throw  new PaiPaiRuntimeExecption(-1,'writeItemAddItem运行失败：参数错误');
		if(! $param->sellerUin) $param->sellerUin=$this->request->app_token['uin'];
		$paramarr=get_object_vars($param);
		$resultarr=&$this->__fireRequest('item.addItem',$paramarr,false);
		$list=new stdClass();
		$this->__firefillProperty($list,$resultarr);
		return get_object_vars($list);
	}	
	/**
	 * 修改商品接口，paipai cmdid:item.modifyItem
	 * <br/>本接口主要用于编辑商品的各个属性,如果不需要编辑某个属性,则无需编辑的属性不需要传值
	 * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
	 * @param PaipaiItemModifyParam $param 修改商品的参数
	 * <br/>itemCode和itemLocalCode至少必须填写一个，索引字段，不能修改
	 * @return array  返回结果itemCode：商品编码
	 */
	function writeItemModifyItem(PaipaiItemModifyParam $param){
		if(! $param || (!$param->itemCode && !$param->itemLocalCode) )
		  throw  new PaiPaiRuntimeExecption(-1,'writeItemModifyItem运行失败：参数错误');
		$paramarr=get_object_vars($param);
		$resultarr=&$this->__fireRequest('item.modifyItem',$paramarr);
		return $resultarr['itemCode'];
	}	
	/**
	 * 修改商品图片接口，paipai cmdid:item.modifyItemPic
	 * <br/>修改指定商品的图片
	 * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
	 * @param  string $itemCode 商品编码
	 * <br/>itemCode和itemLocalCode至少必须填写一个，索引字段，不能修改
	 * @param  string $itemLocalCode 商品私有编码
	 * <br/>itemCode和itemLocalCode至少必须填写一个，索引字段，不能修改
	 * @param  string $picpath 图片路径，图片仅支持jpg和gif格式。 图片大小请不要小于300*300像素，文件大小请不要 大于120KB。
	 * @param  integer $index 第几张商品。取值只能是0到4之间，默认为0。 一般商品也只有一张图片。
	 * @return array  返回结果，数组结构如下 <br/>itemCode：商品编码；<br/>picLink：上传图片后的图片url
	 */
	function writeItemModifyItemPic($itemCode,$itemLocalCode,$picpath,$index=0){
		if(($index<0 || $index>4) || (!$itemCode && !$itemLocalCode) )
		  throw  new PaiPaiRuntimeExecption(-1,'writeItemModifyItemPic运行失败：参数错误');
		if(!file_exists($picpath))
		  throw  new PaiPaiRuntimeExecption(-1,'writeItemModifyItemPic运行失败：找不到图片文件'.$picpath);
		
		$request=clone $this->request;
		$request->httpmethod=PaiPaiRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles['pic']=$picpath;
		$paramarr=array('itemCode'=>$itemCode,'itemLocalCode'=>$itemLocalCode,'index'=>$index);
		$resultarr=&$this->__fireRequest('item.modifyItemPic',$paramarr,true,$request);
		$request=NULL;
		
		$list=new stdClass();
		$this->__firefillProperty($list,$resultarr);
		return get_object_vars($list);		
		
	}	
	/**
	 * 修改商品详情接口，paipai cmdid:item.modifyItemDetailInfo
	 * <br/>修改指定商品的详情说明(商品的具体描述的内容段)
	 * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
	 * @param  string $itemCode 商品编码
	 * <br/>itemCode和itemLocalCode至少必须填写一个，索引字段，不能修改
	 * @param  string $itemLocalCode 商品私有编码
	 * <br/>itemCode和itemLocalCode至少必须填写一个，索引字段，不能修改
	 * @param  string $detailInfo 商品详情信息
	 */
	function writeItemModifyItemDetailInfo($itemCode,$itemLocalCode,$detailInfo){
		if(! $detailInfo || (!$itemCode && !$itemLocalCode) )
		  throw  new PaiPaiRuntimeExecption(-1,'writeItemModifyItemDetailInfo运行失败：参数错误');
		$paramarr=array('itemCode'=>$itemCode,'itemLocalCode'=>$itemLocalCode,'detailInfo'=>$detailInfo);
		$this->__fireRequest('item.modifyItemDetailInfo',$paramarr);
	}		
	/**
	 * 修改商品库存或价格，paipai cmdid:item.modifyItemStock
	 * <br/>本接口主要用于卖家修改某个商品的价格和库存数量（单库存商品的总数量或者多库存商品的某个具体库存的数量）
	 * <br/>注意,今日特价商品只能修改商品描述，不能修改库存
	 * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
	 * @param string $itemCode 商品编码，itemCode和itemLocalCode至少必须填写一个，索引字段，不能修改
	 * @param string $stockAttr 库存属性串，stockId、stockLocalCode和stockAttr至少必须填写一个，索引字段，不能修改
	 * @param integer $stockCount 库存数量，0-1000000。 若该库存数量不变，则应空
	 * @param integer $stockPrice 商品库存价格，单位为分，1-100,000,000。若该库存价格不变，则应为空
	 * @param string $stockId  库存编号，stockId、stockLocalCode和stockAttr至少必须填写一个，索引字段，不能修改
	 * @param string $stockLocalCode 合作商家的私有库存编码，stockId、stockLocalCode和stockAttr至少必须填写一个，索引字段，不能修改
	 * <br/>默认为空，表示不使用此值。
	 * @param string $itemLocalCode 商品私有编码，itemCode和itemLocalCode至少必须填写一个，索引字段，不能修改
	 * <br/>默认为空，表示不使用此值。
	 */
	function writeItemModifyItemStock($itemCode,$stockAttr,$stockCount,$stockPrice,$stockLocalCode=NULL,$stockId=NULL,
	       $itemLocalCode=NULL){
		if(! $itemCode && !$itemLocalCode)
		  throw  new PaiPaiRuntimeExecption(-1,'writeItemModifyItemStock运行失败：参数错误');
		if(! $stockId && !$stockLocalCode && ! $stockAttr)
		  throw  new PaiPaiRuntimeExecption(-1,'writeItemModifyItemStock运行失败：参数错误');
		if(! $stockPrice && !isset($stockCount)) return;
		 
		$paramarr=array('itemCode'=>$itemCode,'itemLocalCode'=>$itemLocalCode,
		'stockId'=>$stockId,'stockLocalCode'=>$stockLocalCode,'stockAttr'=>$stockAttr);
		if(isset($stockCount)) $paramarr['stockCount']=$stockCount;
		if($stockPrice) $paramarr['stockPrice']=$stockPrice;
		$this->__fireRequest('item.modifyItemStock',$paramarr);
	}
	/**
	 * 批量修改商品状态，paipai cmdid:item.modifyItemState
	 * <br/>主要用于卖家批量修改多个商品的状态
	 * @param array $modifyresult  要填充的批量修改状态结果列表，列表项类型@see ItemModifyItemStateResult
	 * @param array $itemCodeArray 商品编码数组，类型string，itemCode和itemLocalCode
	 * 至少必须填写一个 ，且只能同时使用一种，多个商品可使用多个itemCode，不使用传NULL
	 * @param array $itemLocalCodeArray 商品编码数组，类型string，itemCode和itemLocalCode
	 * 至少必须填写一个 ，且只能同时使用一种，多个商品可使用多个itemLocalCode，不使用传NULL
	 * @param string $itemState 商品期望的状态
	 * <br>"IS_FOR_SALE"：上架销售。
	 * <br>"IS_IN_STORE"：放入仓库。
	 * <br/>"IS_PRE_DELETE"：预删除，但不立即物理删除。后台定期清理预删除状态商品。
	 * @return array  已经填充的批量修改状态结果列表  $modifyresult
	 */
	function &writeItemModifyItemState(array &$modifyresult,array $itemCodeArray,array $itemLocalCodeArray,$itemState){
		if(! $itemCodeArray && !$itemLocalCodeArray)
		  throw  new PaiPaiRuntimeExecption(-1,'writeItemModifyItemState运行失败：参数错误');
		if(! $itemState) return ;
		$paramarr=array('itemCode'=>$itemCodeArray,'itemLocalCode'=>$itemLocalCodeArray,
		'itemState'=>$itemState);
		$resultarr=&$this->__fireRequest('item.modifyItemState',$paramarr);
		$resultlist=new _PaipaiItemModifyItemStateResultList(); 
		$this->__firefillProperty($resultlist,$resultarr,_PaipaiItemModifyItemStateResultList::$_DataLayerout['varclass']);
		foreach($resultlist->modifyResult as $item)
		  $modifyresult[]=$item;
	    return $modifyresult;
	}
	/**
	 * 设置商品彩钻折扣，paipai cmdid: item.setItemDiscount
	 * <br/>设置商品支持的彩钻折扣
	 * @param string $itemCode 商品编码，商品编码,可以多个，以|分隔
	 * @param string $discount 彩钻折扣,可以多个，以|分隔，从1级到6级顺序排列
	 */
	function writeItemDiscount($itemCode,$discount){
		if(! $itemCode && !$discount)  throw  new PaiPaiRuntimeExecption(-1,'writeItemDiscount运行失败：参数错误');
		$paramarr=array('itemCode'=>$itemCode,'discount'=>$discount);
		$this->__fireRequest('item.setItemDiscount',$paramarr);
	}	
    /**
     * 读取用户信息，paipai cmdid:user.getUserInfo
     * <br/>用于拉取拍拍网单个用户的基本信息.
     * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
     * @param UserInfo $result 要填充的对象.
     * @param $userUin $userUin 可选，要查的用户QQ，为空时，使用app_token的uin.
     * @return UserInfo 返回读取后的  $result
     */
	function readUserInfo(UserInfo $result,$userUin=NULL) {
		if(!$result)
		  throw  new PaiPaiRuntimeExecption(-1,'readUserInfo运行失败：参数错误');
		if(! $userUin) $userUin=$this->request->app_token['uin'];
		$resultarr = &$this->__fireRequest('user.getUserInfo', array('userUin'=> $userUin));
		return $this->__firefillProperty($result,$resultarr);
	}
    /**
     * 读取收货地址列表，paipai cmdid:user.getReceiverAddressList
     * <br/>如果调用不成功，将抛出PaiPaiRuntimeExecption异常
     * @param ReceiverAddressList $ralist 要填充的对象.
     * @param string $buyerUin 买家QQ号码.
     * @return ReceiverAddressList 返回读取后的  $ralist
     */
	function readUserReceiverAddressList(ReceiverAddressList $ralist,$buyerUin){
		if(!$ralist || (! $ralist->buyerUin && ! $buyerUin))
		  throw  new PaiPaiRuntimeExecption(-1,'readUserReceiverAddressList运行失败：参数错误');
		if(! $buyerUin) $buyerUin=$ralist->buyerUin; 
		$resultarr = &$this->__fireRequest('user.getReceiverAddressList',array('buyerUin'=> $buyerUin));   
		return $this->__firefillProperty($ralist,$resultarr,ReceiverAddressList::$_DataLayerout['varclass']); 
	}
    /**
     * 获取用户的详细信息，paipai cmdid: user.getUserDetailInfo
     * @param PaipaiUserDetailInfo $result 要填充的对象.
     * @param $userUin $userUin 可选，要查的用户QQ，为空时，使用app_token的uin.
     * @return PaipaiUserDetailInfo 返回读取后的  $result
     */
	function readUserDetailInfo(PaipaiUserDetailInfo $result,$userUin=NULL) {
		if(!$result)
		  throw  new PaiPaiRuntimeExecption(-1,'readUserDetailInfo运行失败：参数错误');
		if(! $userUin) $userUin=$this->request->app_token['uin'];
		$resultarr = &$this->__fireRequest('user.getUserDetailInfo', array('userUin'=> $userUin));
		return $this->__firefillProperty($result,$resultarr);
	}	
	//买家:新增收货地址,修改收货地址,删除收货地址
	/**
	 * 查询店铺分类列表，paipai cmdid:shop.getShopCategoryList
	 * @param array $result  要填充的店铺分类列表，列表项类型@see PaipaiShopCategory
	 * @param string $sellerUin 要查的卖家QQ号码
	 * @return array  已经填充的店铺分类列表  $result
	 */
	function &readShopCategoryList(array &$result,$sellerUin=NULL){
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('sellerUin'=>$sellerUin);
		$resultarr=&$this->__fireRequest('shop.getShopCategoryList',$paramarr);
		$resultlist=new _PaipaiShopCategoryList();
		$this->__firefillProperty($resultlist,$resultarr,_PaipaiShopCategoryList::$_DataLayerout['varclass']);
		$result=$resultlist->shopCategoryList;
	    return $result;
	}	
	/**
	 * 查询店铺的促销活动列表，paipai cmdid:shop.getShopPromotionList
	 * @param PaipaiShopPromotionList $result  要填充的促销活动列表
	 * @param string $sellerUin 要查的卖家QQ号码
	 * @return PaipaiShopPromotionList  已经填充的促销活动列表  $result
	 */
	function readShopPromotionList(PaipaiShopPromotionList $result,$sellerUin=NULL){
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('sellerUinList'=>$sellerUin);  //old:sellerUin
		$resultarr=&$this->__fireRequest('shop.getShopPromotionList',$paramarr);
		return $this->__firefillProperty($result,$resultarr,PaipaiShopPromotionList::$_DataLayerout['varclass']);
	}	
	/**
	 * 查询多个店铺促销活动列表，paipai cmdid:shop.getShopsPromotionList
	 * <br/>这个是加了缓存的接口，所以在第一次调用时要先把数据加载到缓存中，等第二次调用时才从缓存中读取数据。
	 * 因此该接口的特性是第一次调用加载数据到缓存中，返回正在建立缓存的信息，第二次以后的调用都是都是直接从缓存中读取数据的
	 * @param array $result  要填充的促销活动列表
	 * @param string $sellerUinList 要查的卖家QQ号码列表，半角逗号隔开
	 * @return array  已经填充的促销活动列表  $result
	 */
	function &readShopsPromotionList(array &$result,$sellerUinList=NULL){
		if(! $sellerUinList) $sellerUinList=$this->request->app_token['uin'];
		$paramarr=array('sellerUinList'=>$sellerUinList);
		$resultarr=&$this->__fireRequest('shop.getShopsPromotionList',$paramarr);
		$resultlist=new _PaipaiShopsPromotionList();
		$this->__firefillProperty($resultlist,$resultarr,_PaipaiShopsPromotionList::$_DataLayerout['varclass']);
		$result=$resultlist->shopsPromotionList;
		return $result;
	}	
	/**
	 * 查询运费模板列表，paipai cmdid: shop.getFreightList
	 * @param PaipaiShopFreightList $result  要填充的查询运费模板列表
	 * @param number $pageIndex 第几页
	 * @param number $pageSize 每页运费模板数
	 * @param number $outputRule 是否输出运费规则：0，1
	 * @param string $sellerUin 查询商家的UIN
	 * @return PaipaiShopFreightList  已经填充的查询运费模板列表
	 */
	function readShopFreightList(PaipaiShopFreightList $result,$pageIndex=1,$pageSize=10,$outputRule=0,$sellerUin=NULL){
		if(!$result)
		  throw  new PaiPaiRuntimeExecption(-1,'readShopFreightList运行失败：参数错误');		
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('sellerUin'=>$sellerUin,'pageIndex'=>$pageIndex,'pageSize'=>$pageSize,'outputRule'=>$outputRule);
		$resultarr=&$this->__fireRequest('shop.getFreightList',$paramarr);
		return $this->__firefillProperty($result,$resultarr,PaipaiShopFreightList::$_DataLayerout['varclass']);
	}	
	/**
	 * 获取友情店铺链接，paipai cmdid: shop.getFriendShopList
	 * @param PaipaiShopFriendShopList $result  要填充的查询友情店铺链接列表
	 * @param number $pageIndex 第几页
	 * @param number $pageSize 每页友情链接数
	 * @param string $sellerUin 查询商家的UIN
	 * @return PaipaiShopFriendShopList  已经填充的查询友情店铺链接列表
	 */
	function readShopFriendShopList(PaipaiShopFriendShopList $result,$pageIndex=1,$pageSize=40,$sellerUin=NULL){
		if(!$result)
		  throw  new PaiPaiRuntimeExecption(-1,'readShopFriendShopList运行失败：参数错误');		
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('sellerUin'=>$sellerUin,'pageIndex'=>$pageIndex,'pageSize'=>$pageSize);
		$resultarr=&$this->__fireRequest('shop.getFriendShopList',$paramarr);
		return $this->__firefillProperty($result,$resultarr,PaipaiShopFriendShopList::$_DataLayerout['varclass']);
	}	
	/**
	 * 查询店铺的信息，paipai cmdid: shop.getShopInfo
	 * @param PaipaiShopInfo $result  要填充的查询店铺的信息
	 * @param number $pageIndex 第几页
	 * @param number $pageSize 每页友情链接数
	 * @param string $sellerUin 查询商家的UIN
	 * @return PaipaiShopInfo  已经填充的查询店铺的信息
	 */
	function readShopInfo(PaipaiShopInfo $result,$sellerUin=NULL){
		if(!$result)
		  throw  new PaiPaiRuntimeExecption(-1,'readShopShopInfo运行失败：参数错误');		
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('sellerUin'=>$sellerUin);
		$resultarr=&$this->__fireRequest('shop.getShopInfo',$paramarr);
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 查询单个商品评价列表，paipai cmdid:evaluation.getItemEvalList
	 * <br/>本接口主要用于查询单个商品评价列表。注：只列出买卖双方已评价的
	 * @param PaipaiEvalList $result  要填充的商品评价列表
	 * @param string $itemCode   商品编码
	 * @param integer $pageIndex 查询第几页,默认第1页
	 * @param integer $pageSize 每页显示的记录数,默认20
	 * @param integer $needReply 是否显示回复，0不显示回复（默认），1显示回复
	 * @param integer $history   0只返回六个月内评价列表（默认），1只返回六个月以前评价列表
	 * @param string $sellerUin  要查的卖家QQ号码，默认为本店
	 * @return PaipaiEvalList    已经填充的商品评价列表  $result
	 */
	function readEvaluationItemEvalList(PaipaiEvalList $result,$itemCode,
	    $pageIndex=1,$pageSize=20,$needReply=0,$history=0,$sellerUin=NULL){
		if(!$result ||!$itemCode)
		  throw  new PaiPaiRuntimeExecption(-1,'readEvaluationItemEvalList运行失败：参数错误');
	    	
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('itemCode'=>$itemCode,'pageIndex'=>$pageIndex,
		'pageSize'=>$pageSize,'needReply'=>$needReply,'history'=>$history,'sellerUin'=>$sellerUin);
		$resultarr=&$this->__fireRequest('evaluation.getItemEvalList',$paramarr);
		return $this->__firefillProperty($result,$resultarr,PaipaiEvalList::$_DataLayerout['varclass']);
	}
	/**
	 * 查询订单评价列表，paipai cmdid: evaluation.getDealEvalList
	 * <br/>本接口主要用于查询订单评价列表。注：只列出买卖双方已评价的
	 * @param PaipaiEvalList $result  要填充的订单评价列表
	 * @param string $dealCode   订单编码
	 * @param integer $needReply 是否显示回复，0不显示回复（默认），1显示回复
	 * @param integer $history   0只返回六个月内评价列表（默认），1只返回六个月以前评价列表
	 * @param string $sellerUin  要查的卖家QQ号码，默认为本店
	 * @return PaipaiEvalList    已经填充的订单评价列表  $result
	 */
	function readEvaluationDealEvalList(PaipaiEvalList $result,$dealCode,$needReply=0,
	                                 $history=0,$sellerUin=NULL){
		if(!$result ||!$dealCode)
		  throw  new PaiPaiRuntimeExecption(-1,'readEvaluationDealEvalList运行失败：参数错误');
	                                 	
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('dealCode'=>$dealCode,'needReply'=>$needReply,
		      'history'=>$history,'sellerUin'=>$sellerUin);
		$resultarr=&$this->__fireRequest('evaluation.getDealEvalList',$paramarr);
		return $this->__firefillProperty($result,$resultarr,PaipaiEvalList::$_DataLayerout['varclass']);
	}
	/**
	 * 查询店铺评价列表，paipai cmdid: evaluation.getShopEvalList
	 * <br/>本接口主要用于查询店铺评价列表。注：只列出买卖双方已评价的
	 * @param PaipaiEvalList $result  要填充的店铺评价列表
	 * @param integer $pageIndex 查询第几页,默认第1页
	 * @param integer $pageSize 每页显示的记录数,默认20
	 * @param integer $needReply 是否显示回复，0不显示回复（默认），1显示回复
	 * @param integer $history   0只返回六个月内评价列表（默认），1只返回六个月以前评价列表
	 * @param string $sellerUin  要查的卖家QQ号码，默认为本店
	 * @return PaipaiEvalList    已经填充的店铺评价列表  $result
	 */
	function readEvaluationShopEvalList(PaipaiEvalList $result,
	    $pageIndex=1,$pageSize=20,$needReply=0,$history=0,$sellerUin=NULL){
		if(!$result)
		  throw  new PaiPaiRuntimeExecption(-1,'readEvaluationShopEvalList运行失败：参数错误');
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('pageIndex'=>$pageIndex,'pageSize'=>$pageSize,
		'needReply'=>$needReply,'history'=>$history,'sellerUin'=>$sellerUin);
		$resultarr=&$this->__fireRequest('evaluation.getShopEvalList',$paramarr);
		return $this->__firefillProperty($result,$resultarr,PaipaiEvalList::$_DataLayerout['varclass']);
	}	
	/**
	 * 查询店铺口碑评分，paipai cmdid: evaluation.getShopEvalGrade
	 * <br/>本接口主要用于查询店铺口碑评分。注：只列出买卖双方已评价的
	 * @param PaipaiShopEvalGrade $result  要填充的店铺口碑评分
	 * @param string $sellerUin  要查的卖家QQ号码，默认为本店
	 * @return PaipaiShopEvalGrade    已经填充的店铺口碑评分  $result
	 */
	function readEvaluationShopEvalGrade(PaipaiShopEvalGrade $result,$sellerUin=NULL){
		if(!$result)
		  throw  new PaiPaiRuntimeExecption(-1,'readEvaluationShopEvalGrade运行失败：参数错误');
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('sellerUin'=>$sellerUin);
		$resultarr=&$this->__fireRequest('evaluation.getShopEvalGrade',$paramarr);
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 商家做评，paipai cmdid: evaluation.evaluateDeal
	 * @param PaipaiEvaluateDealList $result  商家做评结果列表
	 * @param string $dealList  大订单号，多个大订单号以","分隔
	 * @param string $evalContent  评价内容， 长度不超过300字符
	 * @param integer $evalLevel  评价等级 ，1差评2中评3好评(默认)
	 * @param string $sellerUin  卖家QQ号，默认为本店
	 * @return PaipaiEvaluateDealList  商家做评结果列表  $result
	 */
	function writeEvaluationEvaluateDeal(PaipaiEvaluateDealList $result,$dealList,
	         $evalContent,$evalLevel=3,$sellerUin=NULL){
		if(!$result || !$dealList)
		  throw  new PaiPaiRuntimeExecption(-1,'writeEvaluationEvaluateDeal运行失败：参数错误');
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];  
		$paramarr=array('dealList'=>$dealList,'evalContent'=>$evalContent,
		     'evalLevel'=>$evalLevel,'sellerUin'=>$sellerUin);
		$resultarr=&$this->__fireRequest('evaluation.evaluateDeal',$paramarr);
		return $this->__firefillProperty($result,$resultarr);
	}
	/**
	 * 商品评价统计，paipai cmdid: evaluation.getItemEvalStat
	 * <br/>本接口主要用于查询商品评价统计
	 * @param PaipaiItemEvalStat $result  要填充的商品评价统计
	 * @param string $itemCode  商品编码
	 * @return PaipaiItemEvalStat  已经填充的商品评价统计  $result
	 */
	function readEvaluationItemEvalState(PaipaiItemEvalStat $result,$itemCode){
		if(!$result || !$itemCode)
		  throw  new PaiPaiRuntimeExecption(-1,'readEvaluationItemEvalState运行失败：参数错误');
		$paramarr=array('itemCode'=>$itemCode);
		$resultarr=&$this->__fireRequest('evaluation.getItemEvalStat',$paramarr);
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 查询发布导航子类目列表，请使用@see readNavigationChildList
	 * @abstract 函数名称不规范，需要删除
	 */
	function readNavigationList(NavigationList $navlist,$navigationId=0){
		return $this->readNavigationChildList($navlist,$navigationId);
	}
	/**
	 * 查询发布导航子类目列表，paipai cmdid:attr.getNavigationChildList
	 * @param NavigationList $result 要填充的导航子类目列表对象
	 * @param string $navigationId 导航Id，默认值为0，代表根目录
	 * @return NavigationList 返回读取后的  $result
	 */	
	function readNavigationChildList(NavigationList $result,$navigationId=0){
		if(!$result)
		  throw  new PaiPaiRuntimeExecption(-1,'readNavigationList运行失败：参数错误');
		$paramarr=array('sellerUin'=>$this->request->app_token['uin'],'navigationId'=>$navigationId);
		$resultarr=&$this->__fireRequest('attr.getNavigationChildList',$paramarr);
		return $this->__firefillProperty($result,$resultarr,NavigationList::$_DataLayerout['varclass']);		
	}	
	/**
	 * 查询商品类目属性列表，paipai cmdid:attr.getAttributeList
	 * @param ItemAttrList $ialist 要填充的商品类目属性列表对象
	 * @param string $classId 商品品类ID,注意不要传navigationId，因为导航类目下是没有属性的,对应于查询导航接口里返回的isClass=1的nagigationId。
	 * @return ItemAttrList 返回读取后的  $ialist
	 */
	function readItemAttrList(ItemAttrList $ialist,$classId){
		if(!$ialist || !$classId)
		  throw  new PaiPaiRuntimeExecption(-1,'readItemAttrList运行失败：参数错误');
		$paramarr=array('classId'=>$classId);
		$resultarr=&$this->__fireRequest('attr.getAttributeList',$paramarr);
		return $this->__firefillProperty($ialist,$resultarr,ItemAttrList::$_DataLayerout['varclass']);		
	}	
	/**
	 * 查询商品类目属性选项列表，paipai cmdid:attr.getAttrOptionList
	 * @param ItemAttrOptionList $iaolist 要填充的商品类目属性选项列表对象
	 * @param string $classId 商品品类ID,对应于查询导航接口里返回的isClass=1的nagigationId
	 * @param string $attrId  商品品类属性ID
	 * @return ItemAttrOptionList 返回读取后的  $iaolist
	 */
	function readItemAttrOptionList(ItemAttrOptionList $iaolist,$classId,$attrId){
		if(!$iaolist || !$classId || ! $attrId)
		  throw  new PaiPaiRuntimeExecption(-1,'readItemAttrOptionList运行失败：参数错误');
		$paramarr=array('classId'=>$classId,'attrId'=>$attrId);
		$resultarr=&$this->__fireRequest('attr.getAttrOptionList',$paramarr);
		return $this->__firefillProperty($iaolist,$resultarr,ItemAttrOptionList::$_DataLayerout['varclass']);		
	}	
	/**
	 * 查询尺码表模板，paipai cmdid:sizetable.getSizeTemplateList
	 * <br/>根据类目id，查询尺码表模板
	 * @param PaipaiSizeTemplateList $result 要填充的尺码表模板列表对象
	 * @param number $classId 类目id
	 * @return PaipaiSizeTemplateList 返回读取后的尺码表模板列表对象
	 */
	function readSizetableSizeTemplateList(PaipaiSizeTemplateList $result,$classId){
		if(!$result || !$classId )
		  throw  new PaiPaiRuntimeExecption(-1,'readSizetableSizeTemplateList运行失败：参数错误');
		function handleGetResultFunc($result){ //add ""
			return 	str_replace(array('"templateDesc":,'),array('"templateDesc":"",'),$result );
		}		  
		$paramarr=array('classId'=>$classId);
		$resultarr=&$this->__fireRequest('sizetable.getSizeTemplateList',$paramarr,true,NULL,'handleGetResultFunc');
		return $this->__firefillProperty($result,$resultarr,PaipaiSizeTemplateList::$_DataLayerout['varclass']);		
	}
	/**
	 * 查询卖家的尺码表列表接口，paipai cmdid: sizetable.getSellerSizeTableList
	 * <br/>根据类目id，查询尺码表模板
	 * @param PaipaiSizeTableList $result 要填充的尺码表模板列表对象
	 * @param number $classId 类目id
	 * @param number $pageIndex 查询第几页，默认为1
	 * @param number $pageSize 每页显示的记录数，默认为40
	 * @return PaipaiSizeTableList 返回读取后的尺码表模板列表对象
	 */
	function readSizetableSellerSizeTableList(PaipaiSizeTableList $result,$classId=NULL,$pageIndex=1,$pageSize=40,$sellerUin=NULL){
		if(!$result)
		  throw  new PaiPaiRuntimeExecption(-1,'readSizetableSellerSizeTableList运行失败：参数错误');
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('classId'=>$classId,'pageIndex'=>$pageIndex,'pageSize'=>$pageSize,'sellerUin'=>$sellerUin);
		$resultarr=&$this->__fireRequest('sizetable.getSellerSizeTableList',$paramarr);
		return $this->__firefillProperty($result,$resultarr,PaipaiSizeTableList::$_DataLayerout['varclass']);		
	}				
	/**
	 * 查询商品留言列表接口，paipai cmdid:message.getItemMsgList
	 * <br/>1.匿名用户仅查询公开且回复过的留言 2.登录用户可以查询公开且回复留言，以及自己发起的隐藏或未回复状态留言。)
	 * @param PaipaiMessageList $list 要填充的商品留言列表
	 * @param string $itemCode 商品编码
	 * @param integer $pageIndex  页数索引，默认从1开始
	 * @param integer $pageIndex  每页返回的订单记录数，不要超过20。默认为10
	 * @return ItemAttrOptionList 返回读取后的商品留言列表 $list
	 */
	function readMessageItemMsgList(PaipaiMessageList $list,$itemCode,$pageIndex=1,$pageSize=10){
		if(!$list || !$itemCode)
		  throw  new PaiPaiRuntimeExecption(-1,'readMessageItemMsgList运行失败：参数错误');
		function handleGetResultFunc($result){ //add ""
			return 	str_replace(array('total','pageIndex','pageTotal','msgId','sellerUin','sellerName','publisherUin','publisherName','msgContent',
				'msgCreateTime','replyContent','replyCreateTime','msgIspublic',	'msgIsreplied','replyIspublic'),
				array('"total"','"pageIndex"','"pageTotal"','"msgId"','"sellerUin"','"sellerName"','"publisherUin"','"publisherName"','"msgContent"',
				'"msgCreateTime"','"replyContent"','"replyCreateTime"','"msgIspublic"',	'"msgIsreplied"','"replyIspublic"'),$result );
		}			  
		$paramarr=array('itemCode'=>$itemCode,'pageIndex'=>$pageIndex,'pageSize'=>$pageSize);
		$resultarr=&$this->__fireRequest('message.getItemMsgList',$paramarr,true,NULL,'handleGetResultFunc');
		return $this->__firefillProperty($list,$resultarr,PaipaiMessageList::$_DataLayerout['varclass']);		
	}
	/**
	 * 查询查询店铺留言列表接口，paipai cmdid:message.getShopMsgList
	 * <br/>1.匿名用户仅查询公开且回复过的留言 2.登录用户可以查询公开且回复留言，以及自己发起的隐藏或未回复状态留言
	 * @param PaipaiMessageList $list 要填充的商品留言列表
	 * @param string $sellerUin 卖家QQ号,默认为本店QQ
	 * @param integer $pageIndex  页数索引，默认从1开始
	 * @param integer $pageIndex  每页返回的订单记录数，不要超过20。默认为10
	 * @return ItemAttrOptionList 返回读取后的商品留言列表 $list
	 */
	function readMessageShopMsgList(PaipaiMessageList $list,$sellerUin=NULL,$pageIndex=1,$pageSize=10){
		if(!$list)
		  throw  new PaiPaiRuntimeExecption(-1,'readMessageShopMsgList运行失败：参数错误');
		function handleGetResultFunc($result){ //add ""
			return 	str_replace(array('total','pageIndex','pageTotal','msgId','sellerUin','sellerName','publisherUin','publisherName','msgContent',
				'msgCreateTime','replyContent','replyCreateTime','msgIspublic',	'msgIsreplied','replyIspublic'),
				array('"total"','"pageIndex"','"pageTotal"','"msgId"','"sellerUin"','"sellerName"','"publisherUin"','"publisherName"','"msgContent"',
				'"msgCreateTime"','"replyContent"','"replyCreateTime"','"msgIspublic"',	'"msgIsreplied"','"replyIspublic"'),$result );
		}		  
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=array('sellerUin'=>$sellerUin,'pageIndex'=>$pageIndex,'pageSize'=>$pageSize);
		$resultarr=&$this->__fireRequest('message.getShopMsgList',$paramarr,true,NULL,'handleGetResultFunc');
		return $this->__firefillProperty($list,$resultarr,PaipaiMessageList::$_DataLayerout['varclass']);		
	}	
	/**
	 * 添加某个商品的留言信息，paipai cmdid:message.addItemMsg
	 * <br/>登录用户不是该商品卖家
	 * @param string $itemCode 商品编码
	 * @param string $msgContent  留言内容
	 * @param string $itemName  商品名
	 * @param string $msgIspublic  留言是否公开.y:公开; n:不公开（默认y）
	 */
	function writeMessageAddItemMsg($itemCode,$msgContent,$itemName=NULL,$msgIspublic='y'){
		if(!$itemCode)
		  throw  new PaiPaiRuntimeExecption(-1,'writeMessageAddItemMsg运行失败：参数错误');
		$paramarr=array('itemCode'=>$itemCode,'msgContent'=>$msgContent,
		       'itemName'=>$itemName,'msgIspublic'=>$msgIspublic);
		$this->__fireRequest('message.addItemMsg',$paramarr);
	}	
	/**
	 * 添加某个店铺的留言信息，paipai cmdid:message.addShopMsg
	 * <br/>登录用户不是该商品卖家
	 * @param string $sellerUin 店铺QQ
	 * @param string $msgContent  留言内容
	 * @param string $msgIspublic  留言是否公开.y:公开; n:不公开（默认y）
	 */
	function writeMessageAddShopMsg($sellerUin,$msgContent,$msgIspublic='y'){
		if(!$sellerUin || ! $msgContent)
		  throw  new PaiPaiRuntimeExecption(-1,'writeMessageAddShopMsg运行失败：参数错误');
		if($msgIspublic=='y')
		  $paramarr=array('sellerUin'=>$sellerUin,'msgContent'=>$msgContent);
		else
		  $paramarr=array('sellerUin'=>$sellerUin,'msgContent'=>$msgContent,'msgIspublic'=>$msgIspublic);
		$this->__fireRequest('message.addShopMsg',$paramarr);
	}
	/**
	 * 发布产品，paipai cmdid: spu.addSpu
	 * @param PaipaiSpuAddParam $param 发布产品参数
	 * @param string $sellerUin 卖家QQ号，如果为空使用app_token的uin
	 * @return PaipaiProduct 返回发布产品对象,仅productId,productCode,name,productState有效
	 */
	function writeSpuAdd(PaipaiSpuAddParam $param=NULL,$sellerUin=NULL){
		if(!$param || !$param->productName || !$param->classId || !$param->productAttr || !$param->pic)
		  throw  new PaiPaiRuntimeExecption(-1,'writeSpuAdd运行失败：参数错误');
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=get_object_vars($param);
		$paramarr['sellerUin']=$sellerUin;
		unset($paramarr['pic']);
		$request=clone $this->request;
		$request->httpmethod=PaiPaiRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles['pic']=$param->pic;
		$resultarr=&$this->__fireRequest('spu.addSpu',$paramarr,false,$request);
		$result=new PaipaiProduct();
		return $this->__firefillProperty($result,$resultarr);		
	}
	/**
	 * 修改产品，paipai cmdid: spu.modifySpu
	 * @param PaipaiSpuModifyParam $param 修改产品参数
	 * @param string $sellerUin 卖家QQ号，如果为空使用app_token的uin
	 */
	function writeSpuModify(PaipaiSpuModifyParam $param=NULL,$sellerUin=NULL){
		if(!$param || (!$param->productCode && !$param->productId))
		  throw  new PaiPaiRuntimeExecption(-1,'writeSpuModify运行失败：参数错误');
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		$paramarr=get_object_vars($param);
		$paramarr['sellerUin']=$sellerUin;
		unset($paramarr['pic']);
		if($param->pic){
		    $request=clone $this->request;
		    $request->httpmethod=PaiPaiRequest::HTTPMETHOD_POSTWITHFILE;
		    $request->postWithFiles['pic']=$param->pic;
		    $this->__fireRequest('spu.modifySpu',$paramarr,false,$request);
		}
		else $this->__fireRequest('spu.modifySpu',$paramarr,false);
		
	}		
	/**
	 * 获取产品，paipai cmdid: spu.getSpu
	 * @param PaipaiProduct $result 要填充的产品信息
	 * @param string $productCode 产品编码,与spuId两者有任意一个即可
	 * @param number $productId 产品唯一编码,与productCode两者有任意一个即可
	 * @param number $needParseAttr 是否解析产品属性,0,1
	 * @param number $needDetailInfo 是否输出产品详情,0,1
	 * @return PaipaiProduct 返回读取后的产品信息
	 */
	function readSpu(PaipaiProduct $result,$productCode,$productId,$needParseAttr=1,$needDetailInfo=1){
		if(!$result || (!$productCode && !$productId))
		  throw  new PaiPaiRuntimeExecption(-1,'readSpu运行失败：参数错误');
		$paramarr=array('productCode'=>$productCode,'productId'=>$productId,'needParseAttr'=>$needParseAttr,
		   'needDetailInfo'=>$needDetailInfo);
		$resultarr=&$this->__fireRequest('spu.getSpu',$paramarr);
		return $this->__firefillProperty($result,$resultarr);		
	}	
	/**
	 * 查找产品（关键属性），paipai cmdid: spu.findSpuByKeyAttr
	 * @param PaipaiProduct $result 要填充的产品信息
	 * @param string $keyAttrs 关键属性串,格式：属性ID:选项ID:是否文本，例:253080:彪马花纹_03:1,例:10024286:5:0
	 * @param number $classId 品类ID
	 * @param number $needParseAttr 是否解析产品属性,0,1
	 * @param number $needDetailInfo 是否输出产品详情,0,1
	 * @return PaipaiProduct 返回读取后的产品信息
	 */
	function readSpuFindSpuByKeyAttr(PaipaiProduct $result,$keyAttrs,$classId,$needParseAttr=1,$needDetailInfo=1){
		if(!$result || !$keyAttrs || !$classId)
		  throw  new PaiPaiRuntimeExecption(-1,'readSpuFindSpuByKeyAttr运行失败：参数错误');
		$paramarr=array('keyAttrs'=>$keyAttrs,'classId'=>$classId,'needParseAttr'=>$needParseAttr,
		   'needDetailInfo'=>$needDetailInfo);
		$resultarr=&$this->__fireRequest('spu.findSpuByKeyAttr',$paramarr);
		return $this->__firefillProperty($result,$resultarr);		
	}		
	/**
	 * 查找卖家发布产品列表，paipai cmdid: spu.findSpuListOfSeller
	 * <br/>调用本接口可以查询指定卖家发布的产品信息
	 * @param PaipaiSpuList $result 要填充的产品信息列表对象
	 * @param PaipaiFindSpuListOfSellerParam $param 查找参数
	 * @return PaipaiSpuList 返回读取后的产品信息列表对象
	 */
	function readSpuFindSpuListOfSeller(PaipaiSpuList $result,PaipaiFindSpuListOfSellerParam $param=NULL,$sellerUin=NULL){
		if(!$result)
		  throw  new PaiPaiRuntimeExecption(-1,'readSpuFindSpuListOfSeller运行失败：参数错误');
		if(! $sellerUin) $sellerUin=$this->request->app_token['uin'];
		if($param)		  $paramarr=get_object_vars($param);
		else 		  $paramarr=array();
		$paramarr['sellerUin']=$sellerUin;
		$resultarr=&$this->__fireRequest('spu.findSpuListOfSeller',$paramarr);
		return $this->__firefillProperty($result,$resultarr,PaipaiSpuList::$_DataLayerout['varclass']);		
	}	
	/**
	 * 查找产品列表，paipai cmdid: spu.findSpuListBySpuInfo
	 * <br/>调用本接口可以查询指定卖家发布的产品信息
	 * @param PaipaiSpuList $result 要填充的产品信息列表对象
	 * @param PaipaiFindSpuListListBySpuInfoParam $param 查找参数
	 * @return PaipaiSpuList 返回读取后的产品信息列表对象
	 */
	function readSpuFindSpuListBySpuInfo(PaipaiSpuList $result,PaipaiFindSpuListListBySpuInfoParam $param){
		if(!$result || !$param)
		  throw  new PaiPaiRuntimeExecption(-1,'readSpuFindSpuListBySpuInfo运行失败：参数错误');
		$paramarr=get_object_vars($param);
		$resultarr=&$this->__fireRequest('spu.findSpuListBySpuInfo',$paramarr);
		return $this->__firefillProperty($result,$resultarr,PaipaiSpuList::$_DataLayerout['varclass']);		
	}		
	//----private function ------//
	
	private function __setSimpleProperty(ReflectionClass $refclass,$obj,$varname,$varvalue){
	    if($refclass->hasProperty($varname)){
		  $prop = $refclass->getProperty ( $varname);
		  $prop->setValue ( $obj, $varvalue );
		}		
	}
	private function __fillProperty($refclass,$obj,array &$arr,$complexClass=NULL){
		foreach ( $arr as $key => $val ) {
			if(! $key) continue;
			if ($refclass->hasProperty ( $key )===true) {
				$prop = $refclass->getProperty ( $key );
				if(! is_array($val)){ //simple property
                    if($prop->isPrivate() || $prop->isProtected()){
                       $prop->setAccessible(true);
                    }
					$prop->setValue ( $obj, $val );
				}
				elseif(count($val)>0){
				   $propvalue=$prop->getValue($obj);
				   if(is_array($propvalue)){
				   	  $classname=$complexClass[$key];
				   	  if(! $classname)
				   	     $prop->setValue($obj,$val);   //simple set array
				   	   else{
				   	   	  $comprefclass = new ReflectionClass($classname);
				   	   	  $valarr=array();
				   	   	  foreach($val as $valitem){
				   	   	    $compobj=$comprefclass->newInstance();
				   	   	    $this->__fillProperty($comprefclass,$compobj,$valitem,$complexClass);
				   	   	    $this->__setSimpleProperty($comprefclass,$compobj,'__owner',$obj);
				   	   	    $valarr[]=$compobj;
				   	   	  }
				   	   	  $prop->setValue($obj,$valarr); //set obj array
				   	   }
				   }else{
				   	  $classname=$complexClass[$key];
				   	  if($classname || ($propvalue && is_object($propvalue))){
				   	  	$compobj=NULL;
				   	  	if($propvalue){
				   	  	  $classname=get_class($propvalue);
				   	  	  $compobj=$propvalue;
				   	  	}
				   	    $comprefclass = new ReflectionClass($classname);
				   	    if(! $compobj) $compobj=$comprefclass->newInstance();
			            $this->__fillProperty($comprefclass,$compobj,$val,$complexClass);
			            $this->__setSimpleProperty($comprefclass,$compobj,'__owner',$obj);
			            $prop->setValue($obj,$compobj); //set obj
				   	  }else{
				   	    if($prop->isPrivate() || $prop->isProtected()){
                           $prop->setAccessible(true);
                        }				   	  	
				   	  	$prop->setValue($obj,$val);   //simple set array
				   	  }
				   }
				}
			}else{  //not found this property,add property
				if($key!='errorCode' && $key!='errorMessage')
				  $obj->$key=$val;
			}
		}
		return $obj;		
	} 
	private function __firefillProperty($obj,array &$arr,$complexClass=NULL){
		if(! $obj || !$arr || count($arr)==0) return $obj;
		$refclass = new ReflectionObject ($obj);
		$this->__fillProperty($refclass,$obj,$arr,$complexClass);
		$this->__setSimpleProperty($refclass,$obj,'__runtime',$this);
		return $obj;
	}	
	private function &__fireRequest($cmdid,array $paramArr,$retry=true,PaiPaiRequest $tmprequset=NULL,$handleGetResultFunc=NULL){
		if($tmprequset) $request=$tmprequset;
		else  $request=$this->request;
		$tryCount=$this->maxTryCount;
		if ($retry) { //仅可对可 重调用数据不变接口函数 使用
			do {
				try {
					$arr = &$request->getArray ( $cmdid, $paramArr ,$handleGetResultFunc);
					if (! $arr || ($arr ['errorCode'] != 0 && $arr ['errorCode'] !=12288)) //12288:无权访问该服务
						$tryCount --;
					else {
						$tryCount = - 1;
						break;
					}
				} catch ( Exception $e ) {
					$tryCount --;
				}
				if ($tryCount < $this->maxTryCount) {
					$ms = rand ( $this->minTrySpanMicroseconds, $this->maxTrySpanMicroseconds );
					usleep ( $ms );
				}
			} while ( $tryCount > 1 && $tryCount < $this->maxTryCount );
		}//仅可对可 重调用数据不变接口函数 使用
		if ($tryCount!=-1 || !$retry) {
			try {
				$arr = &$request->getArray ( $cmdid, $paramArr ,$handleGetResultFunc);
			} catch ( Exception $e ) {
				throw new PaiPaiRuntimeExecption ( - 2, '系统运行失败:' . $e->getMessage () );
			}
		}
		if(! $arr)
		    throw  new PaiPaiRuntimeExecption(-2,'系统运行失败:接口没有返回值，或接口返回json,xml格式错误解析失败');
		
		if(! $request->checkResult($arr))
		     throw  new PaiPaiRuntimeExecption($arr['errorCode'],
		          '拍拍运行失败['.$arr['errorCode'].']：'.$arr['errorMessage']);
		return $arr;
	}

}

